﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2016._12.Pr1
{
    class Program
    {
        static void Main(string[] args)
        {
            string choice = "n";
            do
            {
                Console.Clear();
                Console.WriteLine("Выберите номер операции:");
                int operation = Int32.Parse(Console.ReadLine());
                switch (operation)
                {
                    case 1:
                        Console.WriteLine("Задайте размер массива: ");
                        Console.WriteLine("Определите количество строк массива:");
                        int sizei = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите количество столбцов массива:");
                        int sizej = Int32.Parse(Console.ReadLine());
                        int [,] array = CreateTwoDimensionArrayWithRandom(sizei, sizej, 1, 10);
                        PrintTwoDimensionarray(array);
                        break;
                    case 2:
                        ChangeTwoDimensionArrayLastRowValueForSumPreviousFourElements();
                        break;
                    case 3:
                        Console.WriteLine("Задайте количество дней в месяце:");
                        int countDay = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Задайте первый день месяца(от 1 до 7):");
                        int firstDay = Int32.Parse(Console.ReadLine());
                        PrintMonthCalendar(countDay, firstDay);
                        break;
                    case 4:
                        Console.WriteLine("Задайте размер квадратного массива: ");
                        int sizeArray = Int32.Parse(Console.ReadLine());
                        SumElementsOfMainDiagonalTwoDimensionArray(sizeArray);
                        break;
                    case 5:
                        Console.WriteLine("Задайте размер массива: ");
                        Console.WriteLine("Определите количество строк массива:");
                        int sizeRow = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите количество столбцов массива:");
                        int sizeColumn = Int32.Parse(Console.ReadLine());
                        CountPairElementsOftwoDimensionArray(sizeRow, sizeColumn);
                        break;
                    case 6:
                        Console.WriteLine("Задайте размер массива: ");
                        Console.WriteLine("Определите количество строк массива:");
                        int sizRow = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите количество столбцов массива:");
                        int sizColumn = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите минимальное значение диапазона массива:");
                        int minLimit = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите максимальное значение диапазона массива:");
                        int maxLimit = Int32.Parse(Console.ReadLine());
                        FindMaximumWithinMinValuesTwoDimensionArray(sizRow, sizColumn, minLimit, maxLimit);
                        break;
                    case 7:
                        Console.WriteLine("Задайте размер массива: ");
                        Console.WriteLine("Определите количество строк массива:");
                        int sizone = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите количество столбцов массива:");
                        int siztwo = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите минимальное значение диапазона массива:");
                        int minLim = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите максимальное значение диапазона массива:");
                        int maxLim = Int32.Parse(Console.ReadLine());
                        PrintSumsElementsOfRowAndColumn(sizone, siztwo, minLim, maxLim);
                        break;
                    case 8:
                        Console.WriteLine("Задайте размер массива: ");
                        Console.WriteLine("Определите количество строк массива:");
                        int row = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите количество столбцов массива:");
                        int column = Int32.Parse(Console.ReadLine());
                        PrintSumElementsRowDefineNumberRowWithmaxSum(row, column);
                        break;
                    case 9:
                        Console.WriteLine("Задайте размер массива: ");
                        Console.WriteLine("Определите количество строк массива:");
                        int rowArray = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите количество столбцов массива:");
                        int columnArray = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите минимальное значение диапазона массива:");
                        int lowLimit = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Определите максимальное значение диапазона массива:");
                        int highLimit = Int32.Parse(Console.ReadLine());
                        PrintMultiplicationOfNonzeroElementsTwoDimensonArray(rowArray, columnArray, lowLimit, highLimit);
                        break;
                    default:
                        Console.WriteLine("Вы ввели неверный символ");
                        break;
                }
                Console.WriteLine();
                Console.WriteLine("Вы хотите продолжить: y/n");
                choice = Console.ReadLine();
            }
            while (choice == "y");
            // Console.WriteLine("Задайте размер массива: ");
            // Console.WriteLine("Определите количество строк массива:");
            // int sizei = Int32.Parse(Console.ReadLine());
            // Console.WriteLine("Определите количество столбцов массива:");
            // int sizej = Int32.Parse(Console.ReadLine());

            // int [,] array = CreateTwoDimensionArrayWithRandom(sizei, sizej, 1, 10);
            // PrintTwoDimensionarray(array);
            //ChangeTwoDimensionArrayLastRowValueForSumPreviousFourElements();

            //Console.WriteLine("Задайте количество дней в месяце:");
            //int countDay = Int32.Parse(Console.ReadLine());
            //Console.WriteLine("Задайте первый день месяца(от 1 до 7):");
            //int firstDay = Int32.Parse(Console.ReadLine());
            //PrintMonthCalendar(countDay, firstDay);

            //Console.WriteLine("Задайте размер квадратного массива: ");
            //int sizeArray = Int32.Parse(Console.ReadLine());
            //SumElementsOfMainDiagonalTwoDimensionArray(sizeArray);
            
        }
        static int[,] CreateTwoDimensionArrayWithRandom(int sizei, int sizej, int minLimit, int maxLimit)
        {
            int[,] array = new int[sizei, sizej];
            Random rnd = new Random();
            for (int i = 0; i < sizei; i++)
            {
                for (int j = 0; j < sizej; j++)
                {
                    array [i, j] = rnd.Next(minLimit, maxLimit+1);
                }
            }
            return array;
        }
        static int[,] PrintTwoDimensionarray (int [,] arrayPrint)
        {
            for (int i = 0; i < arrayPrint.GetLength(0); i++)
            {
                for (int j = 0; j < arrayPrint.GetLength(1); j++)
                {
                    Console.Write("{0}\t", arrayPrint[i, j]);
                }
                Console.WriteLine();
            }
            return arrayPrint;
        }
        static void ChangeTwoDimensionArrayLastRowValueForSumPreviousFourElements()
        {
            Console.WriteLine("Введите нижнее значение для массива:");
            int minLimit = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введите верхнее значение для массива:");
            int maxLimit = Int32.Parse(Console.ReadLine());
            int[,] array = CreateTwoDimensionArrayWithRandom(4, 5, minLimit, maxLimit);
            PrintTwoDimensionarray(array);
            Console.WriteLine();
            for (int i = 0; i < 4; i++)
            {
                int sum = 0;
                for (int j = 0; j < 4; j++)
                {
                    sum += array[i, j];
                }
                array[i, 4] = sum;
            }
            PrintTwoDimensionarray(array);
        }
        static void PrintMonthCalendar(int countDay, int firstDay)
        {
            int[,] array = new int [6,7];
            int day = 0;
            int start = --firstDay;
            for (int i = 0; i < 6; i++)
            {
                for (int j = start; j < 7; j++)
                {
                    array[i, j] = ++day;
                    if (array[i, j] > countDay)
                        array[i,j] = 0; 
                }
                start = 0;
            }
            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    if (array[i,j] == 0)
                    {
                        Console.Write("\t");
                    }
                    else Console.Write("{0}\t", array[i, j]);
                }
                Console.WriteLine();
            }
        }
        static void SumElementsOfMainDiagonalTwoDimensionArray(int sizeArray)
        {
            int[,] array = CreateTwoDimensionArrayWithRandom(sizeArray, sizeArray, -100, 100);
            int sumMainDiag = 0;
            for (int i = 0; i < sizeArray; i++)
            {
                for (int j = 0; j < sizeArray; j++)
                {
                    if (i == j)
                        sumMainDiag += array[i, j]; 
                }
            }
            PrintTwoDimensionarray(array);
            Console.WriteLine("Сумма значений главной диагонали массива: " + sumMainDiag);
        }
        static void CountPairElementsOftwoDimensionArray(int sizei, int sizej)
        {
            int[,] array = CreateTwoDimensionArrayWithRandom(sizei, sizej, 1, 20);
            int pair = 0;
            for (int i = 0; i < sizei; i++)
            {
                for (int j = 0; j < sizej; j++)
                {
                    if (array[i, j] % 2 == 0)
                        pair++;
                }
            }
            PrintTwoDimensionarray(array);
            Console.WriteLine("Количество четных элементов массива: " + pair);
            Console.WriteLine("Количество нечетных элементов массива: " + (array.Length - pair));
        }
        static void FindMaximumWithinMinValuesTwoDimensionArray(int sizei, int sizej, int minLimit, int maxLimit)
        {
            int[,] array = CreateTwoDimensionArrayWithRandom(sizei, sizej, minLimit, maxLimit);
            int maxMin = Int32.MinValue;
            int minColumn = Int32.MaxValue;
            for (int i = 0; i < sizei; i++)
            {
                for (int j = 0; j < sizej; j++)
                {
                    if (array[i, j] < minColumn)
                        minColumn = array[i, j];
                }
                if (maxMin < minColumn)
                    maxMin = minColumn;
            }
            PrintTwoDimensionarray(array);
            Console.WriteLine("Максимальное значение из минимальных по каждому столбцу: " + maxMin);
        }
        static void PrintSumsElementsOfRowAndColumn(int sizei, int sizej, int minLimit, int maxLimit)
        {
            int[,] array = CreateTwoDimensionArrayWithRandom(sizei, sizej, minLimit, maxLimit);
            int[] sumColumn = new int[sizej];
            int[] sumRow = new int[sizei];
            PrintTwoDimensionarray(array);
            Console.WriteLine();
            for (int i = 0; i < sizei; i++)
            {
                for (int j = 0; j < sizej; j++)
                {
                    sumRow[i] += array[i, j];
                    sumColumn[i] += array[j, i];
                }
            }
            PrintArrayValues(sumRow);
            Console.WriteLine();
            PrintArrayValues(sumColumn);

        }
        static void PrintSumElementsRowDefineNumberRowWithmaxSum(int sizei, int sizej)
        {
            int[,] array = CreateTwoDimensionArrayWithRandom(sizei, sizej, 10, 100);
            int sumRow = 0;
            int[] row = new int[sizei];
            PrintTwoDimensionarray(array);
            Console.WriteLine();
            for (int i = 0; i < sizei; i++)
            {
                for (int j = 0; j < sizej; j++)
                {
                    sumRow += array[i, j];
                }
                row[i] = sumRow;
                sumRow = 0;
            }
            PrintArrayValues(row);
            Console.WriteLine();
            Console.WriteLine(Array.IndexOf(row, row.Max()));
        }
        static void PrintMultiplicationOfNonzeroElementsTwoDimensonArray(int sizei, int sizej, int minLimit, int maxLimit)
        {
            int[,] array = CreateTwoDimensionArrayWithRandom(sizei, sizej, minLimit, maxLimit);
            int multiplication = 1;
            for (int i = 0; i < sizei; i++)
            {
                for (int j = 0; j < sizej; j++)
                {
                    if (array[i, j] != 0)
                        multiplication *= array[i, j];
                }
            }
            PrintTwoDimensionarray(array);
            Console.WriteLine();
            Console.WriteLine("Произведение ненулевых элементов массива: " + multiplication);
        }

        static void PrintArrayValues(params int[] arrayShow)
        {
            for (int i = 0; i < arrayShow.Length; i++)
            {
                Console.Write(" [{0}]: ", i);
                Console.Write(arrayShow[i]);
            }

        }
    }
}
